package com.hxzy.common.util;

import com.hxzy.common.exception.ServiceStringException;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
import com.tencentcloudapi.sms.v20210111.models.SendStatus;

/**
 * @Author wy
 * @Description TODO
 * @Date 2023/9/8 11:35
 * @Version 1.0
 */
public class TencentSmsUtil {

    private static final String secretId="AKIDrSmZ6M199sOedNa2wyjCOIo3nKcdgowp";
    private static final String secretKey="lHVsymIX2HFxNYR6UcT7UbS2PWS8gFhu";

    /**
     * 短信验证码
     * {1}为您的登录验证码，请于{2}分钟内填写，如非本人操作，请忽略本短信。
     * @param phone
     * @param templateParamSet
     * @return
     */
    public static boolean sendCodeSms(String phone,String[] templateParamSet) {
        String templateId = "1451707";
        if (templateParamSet == null || templateParamSet.length != 2) {
            throw new ServiceStringException("短信模板参数必须是2个参数，1验证码，2几分钟");
        }
        boolean result = sendSms(templateId, templateParamSet, phone);
        return result;

    }


    /**
     * 商家注册审核不通过短信
     * @param phone
     * @param reason
     * @return
     */
    public static boolean approvalNoPass(String phone,String reason){
        String templateId = "1770265";
        String[] templateParamSet={reason};
        boolean result = sendSms(templateId, templateParamSet, phone);
        return result;
    }

    /**
     * 商家注册审核通过
     * 你申请商家入住信息已审核通过，你可以使用账户登录网站！
     * @param phone
     * @return
     */
    public static boolean approvalPass(String phone){
        String templateId = "1451814";
        boolean result = sendSms(templateId, null, phone);
        return result;
    }


    /**
     * 忘记密码(找回密码)验证码
     * 您的动态验证码为：{1}，您正在进行密码重置操作，该动态验证码{2}分钟有效，如非本人操作，请忽略本短信！
     * @param phone
     * @param templateParamSet
     * @return
     */
    public static boolean forgetPasswordSms(String phone, String[] templateParamSet){
        String templateId = "687969";
        if (templateParamSet == null || templateParamSet.length != 2) {
            throw new ServiceStringException("短信模板参数必须是2个参数，1验证码，2几分钟");
        }
        boolean result = sendSms(templateId, templateParamSet, phone);
        return result;
    }

    /**
     * 腾讯云发短信的核心类
     * @param templateId
     * @param templateParamSet
     * @param phone
     * @return
     */
    private static boolean sendSms(String templateId, String[] templateParamSet,String phone) {
        String status = "";
        try {
            Credential cred = new Credential(secretId, secretKey);

            // 实例化一个http选项，可选，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setReqMethod("POST");
            httpProfile.setConnTimeout(60);
            /* 指定接入地域域名，默认就近地域接入域名为 sms.tencentcloudapi.com ，也支持指定地域域名访问，例如广州地域的域名为 sms.ap-guangzhou.tencentcloudapi.com */
            httpProfile.setEndpoint("sms.tencentcloudapi.com");

            /* 实例化要请求产品(以sms为例)的client对象
             * 第二个参数是地域信息，可以直接填写字符串ap-guangzhou，支持的地域列表参考 https://cloud.tencent.com/document/api/382/52071#.E5.9C.B0.E5.9F.9F.E5.88.97.E8.A1.A8 */
            SmsClient client = new SmsClient(cred, "ap-guangzhou");
            /* 实例化一个请求对象，根据调用的接口和实际情况，可以进一步设置请求参数
             * 你可以直接查询SDK源码确定接口有哪些属性可以设置
             * 属性可能是基本类型，也可能引用了另一个数据结构
             * 推荐使用IDE进行开发，可以方便的跳转查阅各个接口和数据结构的文档说明 */
            SendSmsRequest req = new SendSmsRequest();

            /* 填充请求参数,这里request对象的成员变量即对应接口的入参
             * 你可以通过官网接口文档或跳转到request对象的定义处查看请求参数的定义
             * 基本类型的设置:
             * 帮助链接：
             * 短信控制台: https://console.cloud.tencent.com/smsv2
             * 腾讯云短信小助手: https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81 */

            /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId，示例如1400006666 */
            // 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看
            String sdkAppId = "1400412221";
            req.setSmsSdkAppId(sdkAppId);

            /* 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名 */
            // 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看
            String signName = "易发公众号";
            req.setSignName(signName);

            /* 模板 ID: 必须填写已审核通过的模板 ID */
            // 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看
            req.setTemplateId(templateId);

            //模板参数
            if (templateParamSet != null && templateParamSet.length > 0) {
                req.setTemplateParamSet(templateParamSet);
            }

            /* 下发手机号码，采用 E.164 标准，+[国家或地区码][手机号]
             * 示例如：+8613711112222， 其中前面有一个+号 ，86为国家码，13711112222为手机号，最多不要超过200个手机号 */
            String[] phoneNumberSet = {"+86" + phone};
            req.setPhoneNumberSet(phoneNumberSet);

            /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的 */
            SendSmsResponse res = client.SendSms(req);

            // 输出json格式的字符串回包
            SendStatus[] sendStatusSetList = res.getSendStatusSet();
            for (SendStatus send : sendStatusSetList) {
                status = send.getCode();
            }

        } catch (TencentCloudSDKException e) {
            e.printStackTrace();
        } finally {
            return status.equalsIgnoreCase("OK");
        }
    }
}
